🎖️GitЯра🎖️
src/helpers/ui/E213Display.cpp 890a2e2cffa98dea3ca88db3c3aba72ef23ff3f7 (890a2e2c) Text, 5.14 KB
Tff7b72#Tff7b72include T8b949e"E213Display.h"
Tff7b72#Tff7b72include T8b949e"../../MeshCore.h"
T8b949e// Color scheme
Te6edf3ColorVal Te6edf3UIColorTff7b72:Tff7b72:Te6edf3window_bkg Tff7b72= Te6edf3WHITETb4b4b4;
Te6edf3ColorVal Te6edf3UIColorTff7b72:Tff7b72:Te6edf3title_bkg Tff7b72= Te6edf3WHITETb4b4b4;
Te6edf3ColorVal Te6edf3UIColorTff7b72:Tff7b72:Te6edf3title_txt Tff7b72= Te6edf3BLACKTb4b4b4;
Te6edf3ColorVal Te6edf3UIColorTff7b72:Tff7b72:Te6edf3primary_txt Tff7b72= Te6edf3BLACKTb4b4b4;
Te6edf3ColorVal Te6edf3UIColorTff7b72:Tff7b72:Te6edf3secondary_txt Tff7b72= Te6edf3BLACKTb4b4b4;
Te6edf3ColorVal Te6edf3UIColorTff7b72:Tff7b72:Te6edf3warning_txt Tff7b72= Te6edf3BLACKTb4b4b4;
Te6edf3ColorVal Te6edf3UIColorTff7b72:Tff7b72:Te6edf3popup_bkg Tff7b72= Te6edf3WHITETb4b4b4;
Te6edf3ColorVal Te6edf3UIColorTff7b72:Tff7b72:Te6edf3popup_txt Tff7b72= Te6edf3BLACKTb4b4b4;
Te6edf3ColorVal Te6edf3UIColorTff7b72:Tff7b72:Te6edf3corp_blue Tff7b72= Te6edf3BLACKTb4b4b4;
Te6edf3BaseDisplayTff7b72* Td2a8ffE213Display::detectEInkTb4b4b4(Tb4b4b4)
Tb4b4b4{
T8b949e// Test 1: Logic of BUSY pin
T8b949e// Determines controller IC manufacturer
T8b949e// Fitipower: busy when LOW
T8b949e// Solomon Systech: busy when HIGH
T8b949e// Force display BUSY by holding reset pin active
Te6edf3pinModeTb4b4b4(Te6edf3DISP_RSTTb4b4b4, Te6edf3OUTPUTTb4b4b4)Tb4b4b4;
Te6edf3digitalWriteTb4b4b4(Te6edf3DISP_RSTTb4b4b4, Te6edf3LOWTb4b4b4)Tb4b4b4;
Te6edf3delayTb4b4b4(T79c0ff10Tb4b4b4)Tb4b4b4;
T8b949e// Read whether pin is HIGH or LOW while busy
Te6edf3pinModeTb4b4b4(Te6edf3DISP_BUSYTb4b4b4, Te6edf3INPUTTb4b4b4)Tb4b4b4;
Tffa657bool Te6edf3busyLogic Tff7b72= Te6edf3digitalReadTb4b4b4(Te6edf3DISP_BUSYTb4b4b4)Tb4b4b4;
T8b949e// Test complete. Release pin
Te6edf3pinModeTb4b4b4(Te6edf3DISP_RSTTb4b4b4, Te6edf3INPUTTb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3busyLogic Tff7b72=Tff7b72= Te6edf3LOWTb4b4b4) Tb4b4b4{
Tff7b72#Tff7b72ifdef VISION_MASTER_E213
Tff7b72return Tff7b72new Te6edf3EInkDisplay_VisionMasterE213 Tb4b4b4;
Tff7b72#Tff7b72else
Tff7b72return Tff7b72new Te6edf3EInkDisplay_WirelessPaperV1_1 Tb4b4b4;
Tff7b72#Tff7b72endif
Tb4b4b4} Tff7b72else Tb4b4b4{T8b949e// busy HIGH
Tff7b72#Tff7b72ifdef VISION_MASTER_E213
Tff7b72return Tff7b72new Te6edf3EInkDisplay_VisionMasterE213V1_1 Tb4b4b4;
Tff7b72#Tff7b72else
Tff7b72return Tff7b72new Te6edf3EInkDisplay_WirelessPaperV1_1_1 Tb4b4b4;
Tff7b72#Tff7b72endif
Tb4b4b4}
Tb4b4b4}
Tffa657bool Td2a8ffE213Display::beginTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3_initTb4b4b4) Tff7b72return Tffa657trueTb4b4b4;
Te6edf3powerOnTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72ifTb4b4b4(Te6edf3displayTff7b72=Tff7b72=Tffa657NULLTb4b4b4) Tb4b4b4{
Te6edf3display Tff7b72= Te6edf3detectEInkTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Te6edf3displayTff7b72-Tff7b72>Te6edf3beginTb4b4b4(Tb4b4b4)Tb4b4b4;
T8b949e// Set to landscape mode rotated 180 degrees
Te6edf3displayTff7b72-Tff7b72>Te6edf3setRotationTb4b4b4(T79c0ff3Tb4b4b4)Tb4b4b4;
Te6edf3_init Tff7b72= Tffa657trueTb4b4b4;
Te6edf3_isOn Tff7b72= Tffa657trueTb4b4b4;
Te6edf3clearTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3displayTff7b72-Tff7b72>Te6edf3fastmodeOnTb4b4b4(Tb4b4b4)Tb4b4b4; T8b949e// Enable fast mode for quicker (partial) updates
Tff7b72return Tffa657trueTb4b4b4;
Tb4b4b4}
Tffa657void Td2a8ffE213Display::powerOnTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3_periph_powerTb4b4b4) Tb4b4b4{
Te6edf3_periph_powerTff7b72-Tff7b72>Te6edf3claimTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72else Tb4b4b4{
Tff7b72#Tff7b72ifdef PIN_VEXT_EN
Te6edf3pinModeTb4b4b4(Te6edf3PIN_VEXT_ENTb4b4b4, Te6edf3OUTPUTTb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72ifdef PIN_VEXT_EN_ACTIVE
Te6edf3digitalWriteTb4b4b4(Te6edf3PIN_VEXT_ENTb4b4b4, Te6edf3PIN_VEXT_EN_ACTIVETb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72else
Te6edf3digitalWriteTb4b4b4(Te6edf3PIN_VEXT_ENTb4b4b4, Te6edf3LOWTb4b4b4)Tb4b4b4; T8b949e// Active low
Tff7b72#Tff7b72endif
Tff7b72#Tff7b72endif
Tb4b4b4}
Te6edf3delayTb4b4b4(T79c0ff50Tb4b4b4)Tb4b4b4; T8b949e// Allow power to stabilize
Tb4b4b4}
Tffa657void Td2a8ffE213Display::powerOffTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3_periph_powerTb4b4b4) Tb4b4b4{
Te6edf3_periph_powerTff7b72-Tff7b72>Te6edf3releaseTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72else Tb4b4b4{
Tff7b72#Tff7b72ifdef PIN_VEXT_EN
Tff7b72#Tff7b72ifdef PIN_VEXT_EN_ACTIVE
Te6edf3digitalWriteTb4b4b4(Te6edf3PIN_VEXT_ENTb4b4b4, Tff7b72!Te6edf3PIN_VEXT_EN_ACTIVETb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72else
Te6edf3digitalWriteTb4b4b4(Te6edf3PIN_VEXT_ENTb4b4b4, Te6edf3HIGHTb4b4b4)Tb4b4b4; T8b949e// Turn off power
Tff7b72#Tff7b72endif
Tff7b72#Tff7b72endif
Tb4b4b4}
Tb4b4b4}
Tffa657void Td2a8ffE213Display::turnOnTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3_initTb4b4b4) Te6edf3beginTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72else Tff7b72if Tb4b4b4(Tff7b72!Te6edf3_isOnTb4b4b4) Tb4b4b4{
Te6edf3powerOnTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3displayTff7b72-Tff7b72>Te6edf3fastmodeOnTb4b4b4(Tb4b4b4)Tb4b4b4; T8b949e// Reinitialize display controller after power was cut
Tb4b4b4}
Te6edf3_isOn Tff7b72= Tffa657trueTb4b4b4;
Tb4b4b4}
Tffa657void Td2a8ffE213Display::turnOffTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3_isOnTb4b4b4) Tb4b4b4{
Te6edf3powerOffTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3_isOn Tff7b72= Tffa657falseTb4b4b4;
Tb4b4b4}
Tb4b4b4}
Tffa657void Td2a8ffE213Display::clearTb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3displayTff7b72-Tff7b72>Te6edf3clearTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tffa657void Td2a8ffE213Display::startFrameTb4b4b4(Te6edf3ColorVal Te6edf3bkgTb4b4b4) Tb4b4b4{
Te6edf3display_crcTb4b4b4.Te6edf3resetTb4b4b4(Tb4b4b4)Tb4b4b4;
T8b949e// Fill screen with white first to ensure clean background
Te6edf3displayTff7b72-Tff7b72>Te6edf3fillRectTb4b4b4(T79c0ff0Tb4b4b4, T79c0ff0Tb4b4b4, Te6edf3widthTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3heightTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3WHITETb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3bkg Tff7b72=Tff7b72= T79c0ff0Tb4b4b4) Tb4b4b4{
T8b949e// Fill with black if light background requested (inverted for e-ink)
Te6edf3displayTff7b72-Tff7b72>Te6edf3fillRectTb4b4b4(T79c0ff0Tb4b4b4, T79c0ff0Tb4b4b4, Te6edf3widthTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3heightTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3BLACKTb4b4b4)Tb4b4b4;
Tb4b4b4}
Te6edf3_color Tff7b72= Te6edf3UIColorTff7b72:Tff7b72:Te6edf3primary_txtTb4b4b4;
Te6edf3displayTff7b72-Tff7b72>Te6edf3setTextColorTb4b4b4(Te6edf3_colorTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tffa657void Td2a8ffE213Display::setTextSizeTb4b4b4(Tffa657int Te6edf3szTb4b4b4) Tb4b4b4{
Te6edf3display_crcTb4b4b4.Te6edf3updateTff7b72<Tffa657intTff7b72>Tb4b4b4(Te6edf3szTb4b4b4)Tb4b4b4;
T8b949e// The library handles text size internally
Te6edf3displayTff7b72-Tff7b72>Te6edf3setTextSizeTb4b4b4(Te6edf3szTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tffa657void Td2a8ffE213Display::setColorTb4b4b4(Te6edf3ColorVal Te6edf3cTb4b4b4) Tb4b4b4{
Te6edf3_color Tff7b72= Te6edf3cTb4b4b4;
Te6edf3display_crcTb4b4b4.Te6edf3updateTff7b72<Te6edf3ColorValTff7b72>Tb4b4b4(Te6edf3cTb4b4b4)Tb4b4b4;
Te6edf3displayTff7b72-Tff7b72>Te6edf3setTextColorTb4b4b4(Te6edf3_colorTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tffa657void Td2a8ffE213Display::setCursorTb4b4b4(Tffa657int Te6edf3xTb4b4b4, Tffa657int Te6edf3yTb4b4b4) Tb4b4b4{
Te6edf3display_crcTb4b4b4.Te6edf3updateTff7b72<Tffa657intTff7b72>Tb4b4b4(Te6edf3xTb4b4b4)Tb4b4b4;
Te6edf3display_crcTb4b4b4.Te6edf3updateTff7b72<Tffa657intTff7b72>Tb4b4b4(Te6edf3yTb4b4b4)Tb4b4b4;
Te6edf3displayTff7b72-Tff7b72>Te6edf3setCursorTb4b4b4(Te6edf3xTb4b4b4, Te6edf3yTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tffa657void Td2a8ffE213Display::printTb4b4b4(Tff7b72const Tffa657char Tff7b72*Te6edf3strTb4b4b4) Tb4b4b4{
Te6edf3display_crcTb4b4b4.Te6edf3updateTff7b72<Tffa657charTff7b72>Tb4b4b4(Te6edf3strTb4b4b4, Te6edf3strlenTb4b4b4(Te6edf3strTb4b4b4)Tb4b4b4)Tb4b4b4;
Te6edf3displayTff7b72-Tff7b72>Te6edf3printTb4b4b4(Te6edf3strTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tffa657void Td2a8ffE213Display::fillRectTb4b4b4(Tffa657int Te6edf3xTb4b4b4, Tffa657int Te6edf3yTb4b4b4, Tffa657int Te6edf3wTb4b4b4, Tffa657int Te6edf3hTb4b4b4) Tb4b4b4{
Te6edf3display_crcTb4b4b4.Te6edf3updateTff7b72<Tffa657intTff7b72>Tb4b4b4(Te6edf3xTb4b4b4)Tb4b4b4;
Te6edf3display_crcTb4b4b4.Te6edf3updateTff7b72<Tffa657intTff7b72>Tb4b4b4(Te6edf3yTb4b4b4)Tb4b4b4;
Te6edf3display_crcTb4b4b4.Te6edf3updateTff7b72<Tffa657intTff7b72>Tb4b4b4(Te6edf3wTb4b4b4)Tb4b4b4;
Te6edf3display_crcTb4b4b4.Te6edf3updateTff7b72<Tffa657intTff7b72>Tb4b4b4(Te6edf3hTb4b4b4)Tb4b4b4;
Te6edf3displayTff7b72-Tff7b72>Te6edf3fillRectTb4b4b4(Te6edf3xTb4b4b4, Te6edf3yTb4b4b4, Te6edf3wTb4b4b4, Te6edf3hTb4b4b4, Te6edf3_colorTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tffa657void Td2a8ffE213Display::drawRectTb4b4b4(Tffa657int Te6edf3xTb4b4b4, Tffa657int Te6edf3yTb4b4b4, Tffa657int Te6edf3wTb4b4b4, Tffa657int Te6edf3hTb4b4b4) Tb4b4b4{
Te6edf3display_crcTb4b4b4.Te6edf3updateTff7b72<Tffa657intTff7b72>Tb4b4b4(Te6edf3xTb4b4b4)Tb4b4b4;
Te6edf3display_crcTb4b4b4.Te6edf3updateTff7b72<Tffa657intTff7b72>Tb4b4b4(Te6edf3yTb4b4b4)Tb4b4b4;
Te6edf3display_crcTb4b4b4.Te6edf3updateTff7b72<Tffa657intTff7b72>Tb4b4b4(Te6edf3wTb4b4b4)Tb4b4b4;
Te6edf3display_crcTb4b4b4.Te6edf3updateTff7b72<Tffa657intTff7b72>Tb4b4b4(Te6edf3hTb4b4b4)Tb4b4b4;
Te6edf3displayTff7b72-Tff7b72>Te6edf3drawRectTb4b4b4(Te6edf3xTb4b4b4, Te6edf3yTb4b4b4, Te6edf3wTb4b4b4, Te6edf3hTb4b4b4, Te6edf3_colorTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tffa657void Td2a8ffE213Display::drawXbmTb4b4b4(Tffa657int Te6edf3xTb4b4b4, Tffa657int Te6edf3yTb4b4b4, Tff7b72const Tffa657uint8_t Tff7b72*Te6edf3bitsTb4b4b4, Tffa657int Te6edf3wTb4b4b4, Tffa657int Te6edf3hTb4b4b4) Tb4b4b4{
Te6edf3display_crcTb4b4b4.Te6edf3updateTff7b72<Tffa657intTff7b72>Tb4b4b4(Te6edf3xTb4b4b4)Tb4b4b4;
Te6edf3display_crcTb4b4b4.Te6edf3updateTff7b72<Tffa657intTff7b72>Tb4b4b4(Te6edf3yTb4b4b4)Tb4b4b4;
Te6edf3display_crcTb4b4b4.Te6edf3updateTff7b72<Tffa657intTff7b72>Tb4b4b4(Te6edf3wTb4b4b4)Tb4b4b4;
Te6edf3display_crcTb4b4b4.Te6edf3updateTff7b72<Tffa657intTff7b72>Tb4b4b4(Te6edf3hTb4b4b4)Tb4b4b4;
Te6edf3display_crcTb4b4b4.Te6edf3updateTff7b72<Tffa657uint8_tTff7b72>Tb4b4b4(Te6edf3bitsTb4b4b4, Te6edf3w Tff7b72* Te6edf3h Tff7b72/ T79c0ff8Tb4b4b4)Tb4b4b4;
T8b949e// Width in bytes for bitmap processing
Tffa657uint16_t Te6edf3widthInBytes Tff7b72= Tb4b4b4(Te6edf3w Tff7b72+ T79c0ff7Tb4b4b4) Tff7b72/ T79c0ff8Tb4b4b4;
T8b949e// Process the bitmap row by row
Tff7b72for Tb4b4b4(Tffa657int Te6edf3by Tff7b72= T79c0ff0Tb4b4b4; Te6edf3by Tff7b72< Te6edf3hTb4b4b4; Te6edf3byTff7b72+Tff7b72+Tb4b4b4) Tb4b4b4{
T8b949e// Scan across the row bit by bit
Tff7b72for Tb4b4b4(Tffa657int Te6edf3bx Tff7b72= T79c0ff0Tb4b4b4; Te6edf3bx Tff7b72< Te6edf3wTb4b4b4; Te6edf3bxTff7b72+Tff7b72+Tb4b4b4) Tb4b4b4{
T8b949e// Get the current bit using MSB ordering (like GxEPDDisplay)
Tffa657uint16_t Te6edf3byteOffset Tff7b72= Tb4b4b4(Te6edf3by Tff7b72* Te6edf3widthInBytesTb4b4b4) Tff7b72+ Tb4b4b4(Te6edf3bx Tff7b72/ T79c0ff8Tb4b4b4)Tb4b4b4;
Tffa657uint8_t Te6edf3bitMask Tff7b72= T79c0ff0x80 Tff7b72>Tff7b72> Tb4b4b4(Te6edf3bx Tff7b72& T79c0ff7Tb4b4b4)Tb4b4b4;
Tffa657bool Te6edf3bitSet Tff7b72= Te6edf3bitsTb4b4b4[Te6edf3byteOffsetTb4b4b4] Tff7b72& Te6edf3bitMaskTb4b4b4;
T8b949e// If the bit is set, draw the pixel
Tff7b72if Tb4b4b4(Te6edf3bitSetTb4b4b4) Tb4b4b4{
Te6edf3displayTff7b72-Tff7b72>Te6edf3drawPixelTb4b4b4(Te6edf3x Tff7b72+ Te6edf3bxTb4b4b4, Te6edf3y Tff7b72+ Te6edf3byTb4b4b4, Te6edf3_colorTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tffa657uint16_t Td2a8ffE213Display::getTextWidthTb4b4b4(Tff7b72const Tffa657char Tff7b72*Te6edf3strTb4b4b4) Tb4b4b4{
Tffa657int16_t Te6edf3x1Tb4b4b4, Te6edf3y1Tb4b4b4;
Tffa657uint16_t Te6edf3wTb4b4b4, Te6edf3hTb4b4b4;
Te6edf3displayTff7b72-Tff7b72>Te6edf3getTextBoundsTb4b4b4(Te6edf3strTb4b4b4, T79c0ff0Tb4b4b4, T79c0ff0Tb4b4b4, Tff7b72&Te6edf3x1Tb4b4b4, Tff7b72&Te6edf3y1Tb4b4b4, Tff7b72&Te6edf3wTb4b4b4, Tff7b72&Te6edf3hTb4b4b4)Tb4b4b4;
Tff7b72return Te6edf3wTb4b4b4;
Tb4b4b4}
Tffa657void Td2a8ffE213Display::endFrameTb4b4b4(Tb4b4b4) Tb4b4b4{
Tffa657uint32_t Te6edf3crc Tff7b72= Te6edf3display_crcTb4b4b4.Te6edf3finalizeTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3crc Tff7b72!Tff7b72= Te6edf3last_display_crc_valueTb4b4b4) Tb4b4b4{
Te6edf3displayTff7b72-Tff7b72>Te6edf3updateTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3last_display_crc_value Tff7b72= Te6edf3crcTb4b4b4;
Tb4b4b4}
Tb4b4b4}
Served by rngit 1.5.0 - Generated in 0.36s